|
RAIS
3.2
|
00001 using System; 00002 using System.Collections.Generic; 00003 using System.Text; 00004 using System.Data.Common; 00005 using System.Data.SqlClient; 00006 using System.Data.OleDb; 00007 00008 00009 namespace RAISInstall 00010 { 00011 public class Table:IDisposable 00012 { 00013 SqlConnection sqlConnection; 00014 OleDbConnection accessConnection; 00015 DbDataReader accessReader; 00016 string[] names ; 00017 Type[] types; 00018 00019 string _sourceTableName; 00020 string _destTableName; 00021 string createTableCommand = "create Table {0}({1})"; 00022 string dropTableCommand = "IF EXISTS (SELECT * FROM sysobjects WHERE type = 'U' AND name = '{0}') " + 00023 "BEGIN " + 00024 "DROP Table [{0}] " + 00025 "END "; 00026 00027 string insertCommand="INSERT into {0}({1}) values({2})"; 00028 00029 public Table(string accessConnectionString, string sqlConnectionString) 00030 { 00031 sqlConnection = new SqlConnection(sqlConnectionString); 00032 accessConnection = new OleDbConnection(accessConnectionString); 00033 sqlConnection.Open(); 00034 accessConnection.Open(); 00035 } 00036 00037 private void Drop() 00038 { 00039 DbCommand toCommand = new SqlCommand(string.Format(dropTableCommand, _destTableName), sqlConnection); 00040 toCommand.ExecuteNonQuery(); 00041 } 00042 00043 private void Create() 00044 { 00045 StringBuilder body=new StringBuilder(); 00046 for (int i = 0; i < names.Length; i++) 00047 { 00048 body.Append("["); 00049 body.Append(names[i]); 00050 body.Append("] "); 00051 00052 body.Append(GetSQLType(types[i])); 00053 if(names.Length-1!=i) 00054 body.Append(","); 00055 } 00056 DbCommand toCommand = new SqlCommand(string.Format(createTableCommand,_destTableName, body.ToString()), sqlConnection); 00057 toCommand.ExecuteNonQuery(); 00058 } 00059 00060 public string GetSQLType(Type type) 00061 { 00062 switch(type.Name) 00063 { 00064 case "Int32": 00065 return "int"; 00066 case "String": 00067 return "[nvarchar](max)"; 00068 case "Boolean": 00069 return "tinyint"; 00070 default: 00071 break; 00072 } 00073 return ""; 00074 } 00075 00076 public void Copy(string sourceTable, string destTable) 00077 { 00078 _sourceTableName = sourceTable; 00079 _destTableName = destTable; 00080 DbCommand accessCommand = new OleDbCommand(string.Format("select * from [{0}]", _sourceTableName), accessConnection); 00081 accessReader = accessCommand.ExecuteReader(); 00082 names = new string[accessReader.FieldCount]; 00083 types = new Type[accessReader.FieldCount]; 00084 00085 for (int i = 0; i < accessReader.FieldCount; i++) 00086 { 00087 names[i] = accessReader.GetName(i); 00088 types[i] = accessReader.GetFieldType(i); 00089 } 00090 Drop(); 00091 Create(); 00092 DataCopy(); 00093 } 00094 00095 private void DataCopy() 00096 { 00097 StringBuilder fields = new StringBuilder(); 00098 for (int i = 0; i < names.Length; i++) 00099 { 00100 fields.Append("["); 00101 fields.Append(names[i]); 00102 fields.Append("]"); 00103 if (names.Length - 1 != i) 00104 fields.Append(","); 00105 } 00106 00107 StringBuilder values = new StringBuilder(); 00108 DbCommand toCommand = new SqlCommand(); 00109 toCommand.Connection = sqlConnection; 00110 00111 while (accessReader.Read()) 00112 { 00113 for (int i = 0; i < types.Length; i++) 00114 { 00115 if (accessReader[i] is DBNull) 00116 values.Append("null"); 00117 else 00118 { 00119 if (types[i].Name == "String") 00120 AppendString(values, accessReader[i]); 00121 else if (types[i].Name == "Boolean") 00122 if (((Boolean)accessReader[i])) 00123 values.Append("1"); 00124 else 00125 values.Append("0"); 00126 else 00127 values.Append(accessReader[i].ToString()); 00128 } 00129 if (names.Length - 1 != i) 00130 values.Append(","); 00131 } 00132 toCommand.CommandText = string.Format(insertCommand, _destTableName, fields.ToString(), values.ToString()); 00133 toCommand.ExecuteNonQuery(); 00134 values = new StringBuilder(); 00135 } 00136 } 00137 00138 private void AppendString(StringBuilder sb, object o ) 00139 { 00140 sb.Append("N'"); 00141 sb.Append(o.ToString().Replace("'","''")); 00142 sb.Append("'"); 00143 } 00144 00145 00146 public void Dispose() 00147 { 00148 sqlConnection.Close(); 00149 accessConnection.Close(); 00150 } 00151 } 00152 }